package com.saihai.wordBg;
import com.saihai.common.utils.StringUtils;
import com.saihai.jiankang.student.domain.UfXs;
import com.saihai.jiankang.ufTjglSsrw.domain.UfTjglSsrw;
import com.saihai.jiankang.ufTjglSsrw.service.IUfTjglSsrwService;
import com.saihai.jiankang.zzjg.domain.UfZzjg;
import com.saihai.jiankang.zzjg.service.IUfZzjgService;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@RestController
@RequestMapping("/jiankang/StudentHealthReportGenerator")
public class StudentHealthReportGenerator {


    @Autowired
    private IUfZzjgService ufZzjgService;

    @Autowired
    private IUfTjglSsrwService ufTjglSsrwService;

//    public static void main(String[] args) {
//        List<Student> students = new ArrayList<>();
//        students.add(new Student("张三", "男", "重庆一中"));
//        students.add(new Student("李四", "女", "重庆二中"));
//        students.add(new Student("王五", "男", "重庆三中"));
//        students.add(new Student("赵六", "女", "重庆四中"));
//        students.add(new Student("赵qiw", "女", "重庆四中"));
//
//        try (XWPFDocument doc = new XWPFDocument()) {
//            for (int i = 0; i < students.size(); i += 2) {
//                // 生成两个学生的体检单
//                createStudentReport(doc, students.get(i));
//                if (i + 1 < students.size()) {
//                    createStudentReport(doc, students.get(i + 1));
//                }
//                // 如果不是最后一组学生，则添加分页符
//                if (i + 2 < students.size()) {
//                    XWPFParagraph paragraph = doc.createParagraph();
//                    XWPFRun run = paragraph.createRun();
//                    run.addBreak(BreakType.PAGE);
//                }
//            }
//
//            // 将文档写入D盘
//            try (FileOutputStream out = new FileOutputStream("D:/student_health_reports.docx")) {
//                doc.write(out);
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }


    public void downloadBg( List<UfTjglSsrw> list_xs,String pdfFilePath) {
        try (XWPFDocument doc = new XWPFDocument()) {
            for (int i = 0; i < list_xs.size(); i += 2) {
                // 生成两个学生的体检单
                createStudentReport(doc, list_xs.get(i));
                if (i + 1 < list_xs.size()) {
                    createStudentReport(doc, list_xs.get(i + 1));
                }
                // 如果不是最后一组学生，则添加分页符
                if (i + 2 < list_xs.size()) {
                    XWPFParagraph paragraph = doc.createParagraph();
                    XWPFRun run = paragraph.createRun();
                    run.addBreak(BreakType.PAGE);
                }
            }

            // 将文档写入D盘
            try (FileOutputStream out = new FileOutputStream(pdfFilePath)) {
                doc.write(out);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @PostMapping("/downloadBg-word")
    public ResponseEntity<byte[]> downloadBg(UfXs ufXs) throws IOException {
        List<String> pdfFilePaths = new ArrayList<>();
        UfZzjg ufZzjg = new UfZzjg();
        ufZzjg.setId(87L);
        if (StringUtils.isNotNull(ufXs.getSzbjId())) {
            ufZzjg.setId(Long.parseLong(ufXs.getSzbjId()));
        }
        ufZzjg.setLx(6L);
        List<UfZzjg> list = ufZzjgService.selectChildDept(ufZzjg);

        for (int i = 0; i < list.size(); i++) {
            String pdfFilePath = "D:/" + list.get(i).getMc() + "_" + i + ".docx";
            UfTjglSsrw ufTjglSsrw = new UfTjglSsrw();
            ufTjglSsrw.setSzbjid(list.get(i).getId());
            List<UfTjglSsrw> list_xs = ufTjglSsrwService.selectUfTjglSsrwList(ufTjglSsrw);
            if (list_xs.size() > 0) {
                downloadBg(list_xs,pdfFilePath);
            }

            try {
                pdfFilePaths.add(pdfFilePath);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        String uuid2 = UUID.randomUUID().toString();
        String zipFilePath = "D:/qr_codes" + uuid2 + ".zip";
        try {
            compressPdfsToZip(pdfFilePaths, zipFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 压缩 PDF 文件到 ZIP
        compressPdfsToZip(pdfFilePaths, zipFilePath);

        File zipFile = new File(zipFilePath);
        try (FileInputStream fis = new FileInputStream(zipFile);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                baos.write(buffer, 0, len);
            }
            byte[] content = baos.toByteArray();

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", zipFile.getName());
            for (int i=0 ;i<pdfFilePaths.size();i++) {
                File file = new File(pdfFilePaths.get(i));
                if (file.exists()) {
                    file.delete();
                }
            }

            return ResponseEntity.ok()
                    .headers(headers)
                    .body(content);
        }

    }

    private static void createStudentReport(XWPFDocument doc, UfTjglSsrw student) {
        // 创建标题
        XWPFParagraph titleParagraph = doc.createParagraph();
        titleParagraph.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun titleRun = titleParagraph.createRun();
        titleRun.setText("重庆市学生健康体检报告单");
        titleRun.setFontSize(20);
        titleRun.setBold(true);

        // 创建学生信息段落
        XWPFParagraph infoParagraph = doc.createParagraph();
        infoParagraph.setAlignment(ParagraphAlignment.LEFT);
        XWPFRun infoRun = infoParagraph.createRun();
        infoRun.setText("学生名称：" + student.getXm() + "  性别：" + student.getXb() + "  学校：" + student.getSzxxid());

        // 创建表格
        XWPFTable table = doc.createTable(10,9);
//        // 遍历表格的每一行和每一个单元格
//        for (XWPFTableRow row : table.getRows()) {
//            for (XWPFTableCell cell : row.getTableCells()) {
//                // 在单元格中添加文本
//                XWPFParagraph paragraph = cell.getParagraphs().get(0);
//                XWPFRun run = paragraph.createRun();
//                // 设置段落居中对齐
//                paragraph.setVerticalAlignment(TextAlignment.CENTER);
//                // 设置段落居中对齐
//                paragraph.setAlignment(ParagraphAlignment.CENTER);
//
//                // 设置文字居中对齐
//                run.setBold(true);
//                run.setFontSize(12);
//                run.setTextPosition(10);
//            }
//        }
        table.setWidth(1200);
        table.setTableAlignment(TableRowAlign.CENTER);
        CTTblPr tblPr = table.getCTTbl().getTblPr();
        tblPr.getTblW().setType(STTblWidth.DXA);// 表格固定宽度
        tblPr.getTblW().setW(BigInteger.valueOf(10000L));//表格总宽度
        CTTblLayoutType layout = tblPr.addNewTblLayout();
        layout.setType(STTblLayoutType.AUTOFIT);




        //第一行数据
        table.getRow(0).getCell(0).setText("项目");
        table.getRow(0).getCell(1).setText("身高");
        table.getRow(0).getCell(2).setText("体重");
        table.getRow(0).getCell(3).setText("肺活量");
        table.getRow(0).getCell(4).setText("收缩压");
        table.getRow(0).getCell(5).setText("舒缩压");
        table.getRow(0).getCell(6).setText("左眼");
        table.getRow(0).getCell(7).setText("右眼");
        table.getRow(0).getCell(8).setText("龋齿");

        //第二行数据
        table.getRow(1).getCell(0).setText("结果值");
        table.getRow(1).getCell(1).setText("170cm");
        table.getRow(1).getCell(2).setText("170cm");
        table.getRow(1).getCell(3).setText("170cm");
        table.getRow(1).getCell(4).setText("170cm");
        table.getRow(1).getCell(5).setText("170cm");
        table.getRow(1).getCell(6).setText("170cm");
        table.getRow(1).getCell(7).setText("170cm");
        table.getRow(1).getCell(8).setText("170cm");

        //第三行数据
        table.getRow(2).getCell(0).setText("评价");
        table.getRow(2).getCell(1).setText("-");
        table.getRow(2).getCell(2).setText("-");
        table.getRow(2).getCell(3).setText("-");
        table.getRow(2).getCell(4).setText("-");
        table.getRow(2).getCell(5).setText("170cm");
        table.getRow(2).getCell(6).setText("无");
        table.getRow(2).getCell(7).setText("无");
        table.getRow(2).getCell(8).setText("170cm");

        //横向合并，第一行的0和1
        table.getRow(2).getCell(6).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
        table.getRow(2).getCell(7).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);

        //第四行数据
        table.getRow(3).getCell(0).setText("项目");
        table.getRow(3).getCell(1).setText("左眼沙眼");
        table.getRow(3).getCell(2).setText("右眼沙眼");
        table.getRow(3).getCell(3).setText("乳龋患");
        table.getRow(3).getCell(4).setText("乳龋失");
        table.getRow(3).getCell(5).setText("乳龋补");
        table.getRow(3).getCell(6).setText("恒龋患");
        table.getRow(3).getCell(7).setText("恒龋失");
        table.getRow(3).getCell(8).setText("恒龋补");

        //第五行数据
        table.getRow(4).getCell(0).setText("结果");
        table.getRow(4).getCell(1).setText("左眼沙眼");
        table.getRow(4).getCell(2).setText("右眼沙眼");
        table.getRow(4).getCell(3).setText("乳龋患");
        table.getRow(4).getCell(4).setText("乳龋失");
        table.getRow(4).getCell(5).setText("乳龋补");
        table.getRow(4).getCell(6).setText("恒龋患");
        table.getRow(4).getCell(7).setText("恒龋失");
        table.getRow(4).getCell(8).setText("恒龋补");

        //第六行数据
        table.getRow(5).getCell(0).setText("项目");
        table.getRow(5).getCell(1).setText("头部");
        table.getRow(5).getCell(2).setText("颈部");
        table.getRow(5).getCell(3).setText("胸部");
        table.getRow(5).getCell(4).setText("脊柱");
        table.getRow(5).getCell(5).setText("四肢");
        table.getRow(5).getCell(6).setText("皮肤");
        table.getRow(5).getCell(7).setText("淋巴结");
        table.getRow(5).getCell(8).setText("牙周");

        //第七行数据
        table.getRow(6).getCell(0).setText("结果");
        table.getRow(6).getCell(1).setText("-");
        table.getRow(6).getCell(2).setText("0-");
        table.getRow(6).getCell(3).setText("-");
        table.getRow(6).getCell(4).setText("-");
        table.getRow(6).getCell(5).setText("-");
        table.getRow(6).getCell(6).setText("-");
        table.getRow(6).getCell(7).setText("-");
        table.getRow(6).getCell(8).setText("-");


        //第八行数据
        table.getRow(7).getCell(0).setText("项目");
        table.getRow(7).getCell(1).setText("心");
        table.getRow(7).getCell(2).setText("肺");
        table.getRow(7).getCell(3).setText("肝");
        table.getRow(7).getCell(4).setText("脾");
        table.getRow(7).getCell(5).setText("结膜炎");
        table.getRow(7).getCell(6).setText("内科其他");
        table.getRow(7).getCell(7).setText("外科其他");
        table.getRow(7).getCell(8).setText("既往病史");

        //第九行数据
        table.getRow(8).getCell(0).setText("结果");
        table.getRow(8).getCell(1).setText("-");
        table.getRow(8).getCell(2).setText("0-");
        table.getRow(8).getCell(3).setText("-");
        table.getRow(8).getCell(4).setText("-");
        table.getRow(8).getCell(5).setText("-");
        table.getRow(8).getCell(6).setText("-");
        table.getRow(8).getCell(7).setText("-");
        table.getRow(8).getCell(8).setText("-");

        //第九行数据
        table.getRow(9).getCell(0).setText("指导意见");
        table.getRow(9).getCell(1).setText("saflash");
        table.getRow(9).getCell(2).setText("");
        table.getRow(9).getCell(3).setText("");
        table.getRow(9).getCell(4).setText("");
        table.getRow(9).getCell(5).setText("");
        table.getRow(9).getCell(6).setText("");
        table.getRow(9).getCell(7).setText("");
        table.getRow(9).getCell(8).setText("");

        // 遍历表格的每一行和每一个单元格
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {

                // 在单元格中添加文本
                XWPFParagraph paragraph = cell.getParagraphs().get(0);
                XWPFRun run = paragraph.createRun();
                // 设置段落居中对齐
                paragraph.setAlignment(ParagraphAlignment.CENTER);
                row.setHeight(1200);
                // 设置文字样式
                run.setBold(true);
                run.setFontSize(20);
                run.setTextPosition(10);
            }
            row.setHeight(390);
        }

        XWPFTableRow row = table.getRow(9);
        row.setHeight(1200);

        //横向合并，第一行的0和1

        table.getRow(9).getCell(1).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
        table.getRow(9).getCell(2).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(3).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(4).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(5).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(6).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(7).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
        table.getRow(9).getCell(8).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);

        // 添加一些空白段落用于隔开
        XWPFParagraph blankParagraph = doc.createParagraph();
        blankParagraph.setSpacingAfter(1000);
    }

    public static void compressPdfsToZip(List<String> pdfFilePaths, String zipFilePath) throws IOException {
        File zipFile = new File(zipFilePath);

        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
            for (String pdfFilePath : pdfFilePaths) {
                File pdfFile = new File(pdfFilePath);
                ZipEntry entry = new ZipEntry(pdfFile.getName());
                zipOut.putNextEntry(entry);

                try (FileInputStream fis = new FileInputStream(pdfFile)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = fis.read(buffer)) > 0) {
                        zipOut.write(buffer, 0, len);
                    }
                }

                zipOut.closeEntry();
            }
        }
    }

    static class Student {
        private String name;
        private String gender;
        private String school;

        public Student(String name, String gender, String school) {
            this.name = name;
            this.gender = gender;
            this.school = school;
        }

        public String getName() {
            return name;
        }

        public String getGender() {
            return gender;
        }

        public String getSchool() {
            return school;
        }
    }
}